#include "sqlite3.hpp"   // 包含自定义的SqliteHelper类头文件
#include <cassert>      // 引入断言库用于错误检查

/* SQL查询结果回调函数
 * 参数说明：
 *   arg - 用户传递的上下文参数（此处用于接收查询结果的数组）
 *   col_count - 结果集的列数
 *   result - 当前行的列值数组
 *   fields_name - 字段名称数组
 * 返回值：必须返回0（SQLite规范要求）
 */
int select_stu_callback(void* arg, int col_count, char** result, char** fields_name) {
    std::vector<std::string>* arry = static_cast<std::vector<std::string>*>(arg);
    arry->push_back(result[0]);  // 将第一列（姓名）的值存入结果数组
    return 0; // SQLite规范要求回调函数必须返回0
}

int main() {
    // 创建数据库助手对象，指定数据库文件路径
    SqliteHelper helper("./test.db");
    
    // 1. 创建/打开数据库（使用断言确保操作成功）
    assert(helper.open());  // 如果open()返回false会触发断言终止程序

    // 2. 创建学生表（如果不存在）
    const char* ct = 
        "create table if not exists student("  // 使用IF NOT EXISTS防止重复创建
        "sn int primary key, "    // 学号作为主键
        "name varchar(32), "      // 姓名字段，最大32字符
        "age int);";              // 年龄字段
    assert(helper.exec(ct, nullptr, nullptr));  // 无回调的执行

    // 3. 数据操作示例（当前被注释，可根据需要启用）
    // 插入三条测试数据
    const char* insert_sql = "insert into student values(1, '小明', 18), (2, '小黑', 19), (3, '小红', 18);";
    assert(helper.exec(insert_sql, nullptr, nullptr));
    
    // 更新学号为1的学生姓名
    // const char* update_sql = "update student set name='张小明' where sn=1";
    // assert(helper.exec(update_sql, nullptr, nullptr));
    
    // 删除学号为3的学生记录
    // const char* delete_sql = "delete from student where sn=3";
    // assert(helper.exec(delete_sql, nullptr, nullptr));

    // 执行查询操作
    // const char* select_sql = "select name from student;";  // 查询所有学生姓名
    // std::vector<std::string> arry;          // 存储查询结果的容器
    // assert(helper.exec(select_sql, select_stu_callback, &arry));  // 传递容器地址给回调
    
    // 遍历输出查询结果
    // std::cout << "学生名单：" << std::endl;
    // for (auto& name : arry) {
    //     std::cout << "  • " << name << std::endl;  // 使用项目符号格式输出
    // }

    // 4. 关闭数据库连接（释放资源）
    helper.close();
    
    return 0;
}